{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "WGAN_Channel_Estimation.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/BenYavor/Comparison_of_communication_Autoencoder_MI_GAN_WGAN/blob/master/WGAN_Channel_Estimation.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Y3Mvn1V30ejH",
        "colab_type": "code",
        "outputId": "6d6d1842-2010-4967-c23c-7d3bd7cceffb",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 644
        }
      },
      "source": [
        "!pip install tensorflow==2.0.0\n",
        "import numpy as np\n",
        "%matplotlib inline\n",
        "import matplotlib.pyplot as plt   \n",
        "import warnings\n",
        "with warnings.catch_warnings():\n",
        "    warnings.filterwarnings(\"ignore\",category=FutureWarning)\n",
        "    import tensorflow as tf\n",
        "import os\n",
        "tf.__version__\n",
        "from tensorflow import keras\n",
        "import time\n",
        "from __future__ import absolute_import, division, print_function, unicode_literals\n",
        "import pandas as pd\n",
        "import sys\n",
        "assert sys.version_info >= (3, 5)\n",
        "%matplotlib inline\n",
        "import matplotlib as mpl\n",
        "mpl.rc('axes', labelsize=14)\n",
        "mpl.rc('xtick', labelsize=12)\n",
        "mpl.rc('ytick', labelsize=12)\n",
        "import tensorflow as tf\n",
        "from tensorflow import keras\n",
        "#from sklearn.preprocessing import OneHotEncoder\n",
        "import pandas as pd\n",
        "from scipy import special\n",
        "#from Clustering_Equalgrps.equal_groups import EqualGroupsKMeans\n",
        "from tensorflow.keras import layers\n",
        "np.random.seed(42)\n",
        "tf.random.set_seed(42)"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Requirement already satisfied: tensorflow==2.0.0 in /usr/local/lib/python3.6/dist-packages (2.0.0)\n",
            "Requirement already satisfied: gast==0.2.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (0.2.2)\n",
            "Requirement already satisfied: protobuf>=3.6.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (3.10.0)\n",
            "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.12.0)\n",
            "Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (0.33.6)\n",
            "Requirement already satisfied: google-pasta>=0.1.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (0.1.8)\n",
            "Requirement already satisfied: numpy<2.0,>=1.16.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.17.4)\n",
            "Requirement already satisfied: tensorboard<2.1.0,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (2.0.1)\n",
            "Requirement already satisfied: tensorflow-estimator<2.1.0,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (2.0.1)\n",
            "Requirement already satisfied: wrapt>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.11.2)\n",
            "Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.1.0)\n",
            "Requirement already satisfied: absl-py>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (0.8.1)\n",
            "Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (3.1.0)\n",
            "Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.15.0)\n",
            "Requirement already satisfied: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (0.8.0)\n",
            "Requirement already satisfied: keras-applications>=1.0.8 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.0.8)\n",
            "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0) (1.1.0)\n",
            "Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.6.1->tensorflow==2.0.0) (41.4.0)\n",
            "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.4.1)\n",
            "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (3.1.1)\n",
            "Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (1.7.1)\n",
            "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.16.0)\n",
            "Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.8->tensorflow==2.0.0) (2.8.0)\n",
            "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (1.3.0)\n",
            "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.2.7)\n",
            "Requirement already satisfied: rsa<4.1,>=3.1.4 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (4.0)\n",
            "Requirement already satisfied: cachetools<3.2,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (3.1.1)\n",
            "Requirement already satisfied: requests>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (2.21.0)\n",
            "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (3.1.0)\n",
            "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.6/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.4.7)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests>=2.0.0->requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (2019.9.11)\n",
            "Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests>=2.0.0->requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (2.8)\n",
            "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests>=2.0.0->requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (3.0.4)\n",
            "Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests>=2.0.0->requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (1.24.3)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1wlZswcMF7Rt",
        "colab_type": "text"
      },
      "source": [
        "#### Vergleich\n",
        "Als erstes für feste $k$ und $n$, was sich ändert ist die Samplesize, Anzahl der Samples und SNR"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4qpY-gawAf-9",
        "colab_type": "text"
      },
      "source": [
        "###Systemparameter\n",
        "ACHTUNG: CHANNELANZAHL WURDE UNTERSCHIEDLICH VERWENDET \\\\\n",
        "$k$ - die Anzhal der bits \\\\\n",
        "$M$ - Anzahl der unterschiedlichen Nachrichten \\\\\n",
        "$n$ - channel uses\\\\\n",
        "$N$ - Länge des Rauschvektors"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "czeNNfpY1qc2",
        "outputId": "d066bd47-611c-4325-f07a-6e60bf558ee5",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        }
      },
      "source": [
        "k = 4      # Number of information bits per message, i.e., M=2**k\n",
        "M = 2**k\n",
        "n = 2   # Number of real channel uses per message\n",
        "#k = int(np.log2(M))\n",
        "#n = 2\n",
        "print(M)\n",
        "\n",
        "batch_size = 100\n",
        "\n",
        "SNR = 7\n"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "16\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BA4TqJBOXXIg",
        "colab_type": "text"
      },
      "source": [
        "## Training Parameter"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "tb-DiBwSN255",
        "colab_type": "text"
      },
      "source": [
        "### Different Layers"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "hFMMLrY0LthL",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "randN_initial = keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)\n",
        "\n",
        "EncIn = tf.keras.layers.Input(shape=(M,))#, dtype= tf.int32)\n",
        "e1 = tf.keras.layers.Dense(2*n, activation=None)\n",
        "e2 = tf.keras.layers.Lambda(lambda x:tf.reshape(x, shape=[-1,int(n/2),2]))\n",
        "EncOut = tf.keras.layers.Lambda(lambda x: x/tf.sqrt(2*tf.reduce_mean(tf.square(x))))\n",
        "GenIn = tf.keras.layers.Lambda(lambda x:tf.reshape(x,(tf.shape(x)[0],-1)))\n",
        "# = tf.keras.layers.Lambda(generator)\n",
        "DecIn = tf.keras.layers.Lambda(lambda x:tf.reshape(x, shape=[-1,int(n/2),2]))\n",
        "d1 = tf.keras.layers.Lambda(lambda x:tf.reshape(x, shape=[-1,n]))\n",
        "d2 = tf.keras.layers.Dense(M, activation='relu')\n",
        "DecOut = tf.keras.layers.Dense(M, activation='softmax')\n",
        "\n",
        "\n",
        "#noise_std = EbNo_to_noise(TRAINING_SNR)\n",
        "# custom functions / layers without weights\n",
        "norm_layer = keras.layers.Lambda(lambda x: tf.divide(x,tf.sqrt(2*tf.reduce_mean(tf.square(x)))))\n",
        "shape_layer = keras.layers.Lambda(lambda x: tf.reshape(x, shape=[-1,2,n]))\n",
        "shape_layer2 = keras.layers.Lambda(lambda x: tf.reshape(x, shape=[-1,n]))\n",
        "channel_layer = keras.layers.Lambda(lambda x: x + tf.random.normal(tf.shape(x), mean=0.0, stddev=noise_std))\n",
        "\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7J96hJhKO9VJ",
        "colab_type": "text"
      },
      "source": [
        "### Help functions"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "uV7pjryDv4M4",
        "colab_type": "code",
        "outputId": "8124941b-821b-47dc-9a58-74db94e9495d",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 53
        }
      },
      "source": [
        "def EbNo2Sigma(ebnodb):\n",
        "    '''Convert Eb/No in dB to noise standard deviation'''\n",
        "    ebno = 10**(ebnodb/10)\n",
        "    return 1/np.sqrt(2*(2*k/n)*ebno)\n",
        "\n",
        "def EbNo_to_noise(ebnodb):\n",
        "    '''Transform EbNo[dB]/snr to noise power'''\n",
        "    ebno = 10**(ebnodb/10)\n",
        "    noise_std = 1/np.sqrt(2*(2*k/n)*ebno) \n",
        "    return noise_std\n",
        "\n",
        "\n",
        "def real_channel(x,noise_std):\n",
        "    # Black-box Channel\n",
        "    #AWGN\n",
        "    return x + tf.random.normal(tf.shape(x), mean=0.0, stddev=noise_std)\n",
        "\n",
        "    #Rayleigh\n",
        "    #return x + tf.sqrt(tf.square(tf.random_normal(tf.shape(x), mean=0.0, stddev=noise_std)) + tf.square(tf.random_normal(tf.shape(x), mean=0.0, stddev=noise_std)))\n",
        "    \n",
        "    #Uniform U(-3;3)    \n",
        "    #return x + tf.random_uniform(tf.shape(x), minval=-2, maxval=2)\n",
        "\n",
        "def B_Ber(input_msg, msg):\n",
        "    '''Calculate the Batch Bit Error Rate'''\n",
        "    pred_error = tf.not_equal(tf.argmax(msg, 1), tf.argmax(input_msg, 1))\n",
        "    bber = tf.reduce_mean(tf.cast(pred_error, tf.float32))\n",
        "    return bber\n",
        "\n",
        "def random_sample(batch_size=32):\n",
        "    msg = np.random.randint(M, size=batch_size)\n",
        "    return msg\n",
        "\n",
        "\n",
        "\n",
        "\n",
        "def B_Ber_m(input_msg, msg):\n",
        "    '''Calculate the Batch Bit Error Rate'''\n",
        "    pred_error = tf.not_equal(input_msg, tf.argmax(msg, 1))      \n",
        "    bber = tf.reduce_mean(tf.cast(pred_error, tf.float32))\n",
        "    return bber\n",
        "\n",
        "def SNR_to_noise(snrdb):\n",
        "    '''Transform EbNo[dB]/snr to noise power'''\n",
        "    snr = 10**(snrdb/10)\n",
        "    noise_std = 1/np.sqrt(2*snr)\n",
        "    return noise_std\n",
        "\n",
        "\n",
        "noise_std = EbNo2Sigma(SNR)\n",
        "\n",
        "print(EbNo2Sigma(SNR))\n",
        "print(EbNo_to_noise(SNR))"
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "0.15792649852735607\n",
            "0.15792649852735607\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AOoYuK_jR9rH",
        "colab_type": "text"
      },
      "source": [
        "# Models"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-05-14T06:31:29.973887Z",
          "start_time": "2019-05-14T06:31:29.969185Z"
        },
        "colab_type": "code",
        "id": "WbqrTgB_SYbf",
        "colab": {}
      },
      "source": [
        "### install necessary packages if in colab\n",
        "def run_subprocess_command(cmd):\n",
        "  process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)\n",
        "  for line in process.stdout:\n",
        "      print(line.decode().strip())\n",
        "      \n",
        "#import sys, subprocess\n",
        "#IN_COLAB = 'google.colab' in sys.modules\n",
        "#colab_requirements = ['pip install tf-nightly-gpu-2.0-preview==2.0.0.dev20190513']\n",
        "#if IN_COLAB:\n",
        "#  for i in colab_requirements:\n",
        "#    run_subprocess_command(i)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "3eKFKF5HSYbi"
      },
      "source": [
        "### load packages"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-05-14T06:31:30.061880Z",
          "start_time": "2019-05-14T06:31:29.975587Z"
        },
        "colab_type": "code",
        "id": "at1xYevFSYbl",
        "colab": {}
      },
      "source": [
        "# make visible the only one GPU\n",
        "#%env CUDA_VISIBLE_DEVICES=3"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-05-14T06:31:38.044471Z",
          "start_time": "2019-05-14T06:31:33.805821Z"
        },
        "colab_type": "code",
        "id": "xhqU6sqiSYbz",
        "colab": {}
      },
      "source": [
        "def creat_train_data(length):\n",
        "  train_dataset=[]\n",
        "  for i in range(length):\n",
        "    x = tf.random.normal((batch_size,n),dtype=tf.dtypes.float32) \n",
        "    x = x/tf.sqrt(2*tf.reduce_mean(tf.square(x)))\n",
        "    train_dataset.append(real_channel(x,noise_std))\n",
        "  return train_dataset\n",
        "\n",
        "train_dataset = creat_train_data(100)\n",
        "\n",
        "test_dataset = creat_train_data(100)\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "HLxPlL7QSYb1"
      },
      "source": [
        "### Define the network as tf.keras.model object"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "n4gYXZf9hkzY",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "@tf.function\n",
        "def train():\n",
        "  gen_gradients, disc_gradients = compute_gradients()\n",
        "  apply_gradients(gen_gradients, disc_gradients)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "PPsFbJwchvhq",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def compute_gradients():\n",
        "  \"\"\" passes through the network and computes loss\n",
        "  \"\"\"\n",
        "  x= tf.random.normal((batch_size,n),dtype=tf.dtypes.float32)\n",
        "  x =x/tf.sqrt(2*tf.reduce_mean(tf.square(x)))\n",
        "  real_data = tf.concat(values=[real_channel(x,noise_std), x], axis=1)\n",
        "  with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:\n",
        "    disc_loss, gen_loss = compute_loss(real_data)\n",
        "  gen_gradients = gen_tape.gradient(gen_loss, w_generator.trainable_variables)\n",
        "  disc_gradients = disc_tape.gradient(disc_loss, w_discriminator.trainable_variables)\n",
        "\n",
        "  #print(\"compute_gradients\")\n",
        "\n",
        "  return gen_gradients, disc_gradients"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-05-14T06:31:38.068468Z",
          "start_time": "2019-05-14T06:31:38.046751Z"
        },
        "colab_type": "code",
        "id": "Wyipg-4oSYb1",
        "colab": {}
      },
      "source": [
        "def compute_loss(real_data):\n",
        "  \"\"\" passes through the network and computes loss\n",
        "  \"\"\"\n",
        "        ### pass through network\n",
        "        # generating noise from a uniform distribution\n",
        "  ####Mein noise ist anders als hier\n",
        "  gradient_penalty_weight = 0.1   #0.5\n",
        "  x= tf.random.normal((batch_size,n),dtype=tf.dtypes.float32)\n",
        "  x_samp =x/tf.sqrt(2*tf.reduce_mean(tf.square(x)))\n",
        "  #print(x_samp)\n",
        "  # run noise through generator\n",
        "  x_gen = tf.concat(values=[w_generator(x_samp),x_samp], axis=1)     # x_gen zu fake_data\n",
        "  # discriminate x and x_gen\n",
        "  logits_x = w_discriminator(real_data)\n",
        "  logits_x_gen = w_discriminator(x_gen)\n",
        "\n",
        "  # gradient penalty\n",
        "  d_regularizer = gradient_penalty(real_data, x_gen)\n",
        "        ### losses\n",
        "  disc_loss = (tf.reduce_mean(logits_x) - tf.reduce_mean(logits_x_gen)+ d_regularizer * gradient_penalty_weight)\n",
        "\n",
        "        # losses of fake with label \"1\"\n",
        "  gen_loss = tf.reduce_mean(logits_x_gen)\n",
        "  return disc_loss, gen_loss\n",
        "\n",
        "\n",
        "\n",
        "def apply_gradients(gen_gradients, disc_gradients):\n",
        "  w_gen_optimizer.apply_gradients(zip(gen_gradients, w_generator.trainable_variables))\n",
        "  w_disc_optimizer.apply_gradients(zip(disc_gradients, w_discriminator.trainable_variables))\n",
        "\n",
        "def gradient_penalty(x, x_gen):\n",
        "  epsilon = tf.random.uniform([x.shape[0], 1, 1, 1], 0.0, 1.0)\n",
        "  x_hat = epsilon * x + (1 - epsilon) * x_gen\n",
        "  with tf.GradientTape() as t:\n",
        "      t.watch(x_hat)\n",
        "      d_hat = w_discriminator(x_hat)\n",
        "  gradients = t.gradient(d_hat, x_hat)\n",
        "  ddx = tf.sqrt(tf.reduce_sum(gradients ** 2, axis=[1, 2]))\n",
        "  d_regularizer = tf.reduce_mean((ddx - 1.0) ** 2)\n",
        "  #print(\"gradient_penalty\")\n",
        "  return d_regularizer\n",
        "\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "qEVl58nDSYb4"
      },
      "source": [
        "### Define the network architecture\n",
        "\n",
        "## Changes\n",
        "in dem vorherigen GAN modell hat der discriminator side_infomation erhalten, worin das original Rauschen enthalten war. Dies ist in dem WGAN paper anders gemacht worden."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "LXbS5lM9Tb9B",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def get_generator(n):\n",
        "  input1 = tf.keras.layers.Input(shape=(n,))\n",
        "  x1 = tf.keras.layers.Dense(n)(input1)\n",
        "  input2 =tf.random.normal([tf.shape(input1)[0],n])\n",
        "  x2 = tf.keras.layers.Dense(n)(input2)\n",
        "  subtracted = tf.keras.layers.Concatenate(1)([x1, x2])\n",
        "  h1 = tf.keras.layers.Dense(32,use_bias=True,  activation='relu')(subtracted)\n",
        "  h2 = tf.keras.layers.Dense(32,use_bias=True,activation='relu')(h1)\n",
        "  out = tf.keras.layers.Dense(n, use_bias= True,activation='linear')(h2)\n",
        "  generator = tf.keras.models.Model(inputs=[input1], outputs=out)\n",
        "  return generator\n",
        "#keras.utils.plot_model(generator, 'Structure_of_MI_estimation.png', show_shapes=True)\n",
        "\n",
        "w_generator = get_generator(n)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-05-14T06:31:38.219862Z",
          "start_time": "2019-05-14T06:31:38.070570Z"
        },
        "colab_type": "code",
        "id": "dyU21SGbSYb4",
        "colab": {}
      },
      "source": [
        "N_Z = n\n",
        "\n",
        "\n",
        "#w_generator = keras.models.Sequential([\n",
        "#  tf.keras.layers.Input(shape=(n,)),\n",
        "#  tf.keras.layers.Dense(32,use_bias=True,  activation='relu'),\n",
        "#  tf.keras.layers.Dense(32,use_bias=True, activation='relu'),\n",
        "#  tf.keras.layers.Dense(n, use_bias= True, activation='linear')\n",
        "#   ])\n",
        "\n",
        "w_discriminator = keras.models.Sequential([\n",
        "  tf.keras.layers.Dense(32,use_bias=True,activation='relu',input_shape=((2*n,))),\n",
        "  #model.add(tf.keras.layers.Dense(32,use_bias=True, kernel_initializer=randN_initial, activation='relu'))\n",
        "  tf.keras.layers.Dense(1,use_bias=False, activation='linear')\n",
        "])\n",
        "\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-05-10T18:40:40.306731Z",
          "start_time": "2019-05-10T18:40:40.292930Z"
        },
        "colab_type": "text",
        "id": "wi_ZuWBdSYb6"
      },
      "source": [
        "### Create Model"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-05-14T06:31:39.047233Z",
          "start_time": "2019-05-14T06:31:38.222179Z"
        },
        "colab_type": "code",
        "id": "dSYjNRAwSYb7",
        "colab": {}
      },
      "source": [
        "# optimizers\n",
        "w_gen_optimizer = tf.keras.optimizers.Adam(0.0001, beta_1=0.5,beta_2 =0.1)  #RMSprop(0.0001) works as well\n",
        "w_disc_optimizer = tf.keras.optimizers.Adam(0.0001, beta_1=0.5,beta_2 =0.1)  #(0.001)# train the model\n",
        "\n",
        "\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "qwBg8NwrSYb9"
      },
      "source": [
        "### Train the model"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-05-14T06:31:39.056490Z",
          "start_time": "2019-05-14T06:31:39.049635Z"
        },
        "colab_type": "code",
        "id": "47sz8RMeSYb-",
        "colab": {}
      },
      "source": [
        "def generate_evaluation_data(batch_size=100):\n",
        "  x = tf.random.normal((batch_size,n),dtype=tf.dtypes.float32)    #randomly sample input data (\"fake\" AE messages)\n",
        "  x = x/tf.sqrt(2*tf.reduce_mean(tf.square(x))) #Average power normalization (not required if standard normal distribution is used )\n",
        "  fake_eval_data = w_generator([x])\n",
        "  real_eval_data = real_channel(x,noise_std) #tf.concat(values=[real_channel(x),x], axis=1)\n",
        "  inputs = x\n",
        "  return  real_eval_data, fake_eval_data, inputs \n",
        "\n",
        "\n",
        "\n",
        "def get_evaluation_data(evaluation_per_epochs=100):\n",
        "  real_eval_data = []\n",
        "  fake_eval_data  = []\n",
        "  inputs = []\n",
        "  for i in range(evaluation_per_epochs):\n",
        "    data = generate_evaluation_data()\n",
        "    real_eval_data.append(data[0])\n",
        "    fake_eval_data.append(data[1])\n",
        "    inputs.append(data[2])\n",
        "  return real_eval_data, fake_eval_data, inputs\n",
        "\n",
        "\n",
        "def test_eval(real_eval_data,fake_eval_data,inputs):\n",
        "  hist_range = 1\n",
        "  \n",
        "  \n",
        "  fake_output_hist = np.mean(fake_eval_data,axis=0)  # Changed from 0 to 1\n",
        "  real_output_hist = np.mean(real_eval_data,axis=0)\n",
        "  inputs_hist = np.mean(inputs,axis=0)\n",
        "    \n",
        "  fake_output_hist1 = np.reshape( fake_output_hist,[-1,])\n",
        "  real_output_hist1 = np.reshape( real_output_hist,[-1,])\n",
        "    \n",
        "  plt.hist(fake_output_hist1,bins=100,range=(-hist_range,hist_range),density=True,histtype='step')\n",
        "  plt.hist(real_output_hist1,bins=100,range=(-hist_range,hist_range),density=True,histtype='step')    \n",
        "  plt.title(\"noise distribution\")\n",
        "  plt.legend([\"generator\", \"target\"])\n",
        "  plt.show()\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-05-14T06:31:39.152670Z",
          "start_time": "2019-05-14T06:31:39.058505Z"
        },
        "colab_type": "code",
        "id": "pKkEX9yBSYcB",
        "colab": {}
      },
      "source": [
        "# a pandas dataframe to save the loss information to\n",
        "losses = pd.DataFrame(columns = ['disc_loss', 'gen_loss'])\n",
        "time_to_train_w_gan = 0"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-05-14T07:04:26.791634Z",
          "start_time": "2019-05-14T07:04:17.126436Z"
        },
        "colab_type": "code",
        "id": "00dI2M4iSYcE",
        "outputId": "e379a54b-1e29-4817-a40f-b774b004206f",
        "cellView": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        }
      },
      "source": [
        "%%time\n",
        "n_epochs = 2501   #2501\n",
        "start = time.time()\n",
        "for epoch in range(n_epochs):\n",
        "  x= tf.random.normal((batch_size,n),dtype=tf.dtypes.float32)\n",
        "  x_samp =x/tf.sqrt(2*tf.reduce_mean(tf.square(x)))\n",
        "  train()\n",
        "    # test on holdout\n",
        "  loss = []\n",
        "  if epoch%500 == 0:\n",
        "    real_c = tf.concat(values=[real_channel(x,noise_std), x], axis=1)\n",
        "    fake_c = w_generator(x)\n",
        "    real_eval_data, fake_eval_data, inputs = get_evaluation_data()\n",
        "    test_eval(real_eval_data, fake_eval_data, inputs)\n",
        "    tf.print(fake_c[0])\n",
        "    #tf.print(disc_loss, gen_loss)\n",
        "  real_data = tf.concat(values=[real_channel(x,noise_std), x], axis=1)  \n",
        "  loss.append(compute_loss(real_data))\n",
        "  losses.loc[len(losses)] = np.mean(loss, axis=0)\n",
        "  if epoch%100 == 0:\n",
        "    print(\n",
        "       \"Epoch: {} | disc_loss: {} | gen_loss: {}\".format(\n",
        "            epoch, losses.disc_loss.values[-1], losses.gen_loss.values[-1]\n",
        "        )  )\n",
        "time_to_train_w_gan += time.time()-start\n",
        "print()\n",
        "tf.saved_model.save(w_generator,'/tmp/saved_model/')"
      ],
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nODEivgB0IzckdBiwC1gBTImIlRUeg5mZlaHU4Zy1QG2R4r9tYbvb8t7XA+PKiM3MzNqAp2wwM8uY\nUrt6zKwNjZ/9DGs2bAWgf++DWTTrlA6OyPZnTvxmncCaDVupmz0ZgMGznuzgaGx/564eM7OMceI3\nM8sYJ34zs4xx4jczyxgnfjOzjHHiNzPLGCd+M7OMceI3M8sYJ34zs4xx4jczyxgnfjOzjHHiNzPL\nGCd+M7OMceI3M8sYJ34zs4wp9WHrMyUtlrRd0n3Nyk6VtELSR5KelTSohXYGJ3U+Srb5fIXxm5lZ\nmUq94l9L7kHp9+avlNQXeAy4CTgUWAw82EI7C4D/D/QB/gZ4RFK/MmM2M7MKlJT4I+KxiPg+sL5Z\n0ZeAZRHxcERsI/dA9tGShjVvQ9JQ4Fjg5ojYGhGPAm8AUys5ADMzK0+lffzDgaWNCxGxBXg7WV+o\n7q8iYnPeuqVF6iJpRtK9tLi+vr7CMM3MrFGlib8a2Nhs3UagR4V1iYh5EVETETX9+rk3yMwsLZUm\n/gagZ7N1PYHNFdY1M7M2UmniXwaMblyQ1B04KllfqO6RkvKv8EcXqWtmZm2k1OGcXSVVAV2ALpKq\nJHUFvgeMkDQ1Kf8K8HpErGjeRkSsBF4Dbk62/yIwCng0rYMxM7O9K/WK/0ZgKzALuCh5f2NE1JMb\nlfP3wIfAHwHnN24kaa6kuXntnA/UJHVnA+cmbZiZWTvpWkqliKglN1SzUNlPgD2GbyZllzdbrgNO\nLiM+MzNLmadsMDPLGCd+M7OMceI3M8sYJ34zs4xx4jczyxgnfjOzjHHiNzPLGCd+M7OMceI3M8sY\nJ34zs4xx4jczyxgnfjOzjHHiNzPLGCd+M7OMceI3M8sYJ34zs4xx4jczyxgnfjOzjHHiNzPLmIoT\nv6SGZq9dku4uUnd6Up5f/+RKYzAzs9KV9LD1lkREdeN7SdXAb4CHW9jkpYiYUOl+zcysddLu6pkK\nfAC8kHK7ZmaWkrQT/yXAtyMiWqhzjKR1klZKuklSwf91SJohabGkxfX19SmHaWaWXaklfkmDgInA\n/S1Uex4YAXyS3P8OLgCuK1QxIuZFRE1E1PTr1y+tMM3MMi/NK/4/BX4aEauKVYiIX0XEqojYHRFv\nAH8HnJtiDGZmthdpJv6Laflqv5AAlGIMZma2F6kkfkknAP1peTQPkr4g6bDk/TDgJuDxNGIwM7PS\npHXFfwnwWERszl8paWAyVn9gsupU4HVJW4D/AB4DbkspBjMzK0HF4/gBIuKyIuvfBarzlq8Frk1j\nn2Zm1jqessHMLGOc+M3MMsaJ38wsY5z4zcwyJpWbu2aZdedI2Phu7n2vgXD1Gx0bj1kJnPjNKrHx\nXajdmHtf26tjYzErkbt6zMwyxlf8ZkX0730wg2c92fR+0axTWt6g18DfX/W728c6MSd+syLyE33j\nH4AW5Sd6d/tYJ+auHjOzjPEVv1kHGT/7GdZs2ArkupLM2osTv1kHWbNhK3WzJ3d0GJZB7uoxM8sY\nJ34zs4xx4jczyxgnfjOzjHHiNzPLGCd+M7OMSeth6wslbUuer9sg6RdF6knS1yStT15fk6Q0YjDb\nXzROFTF41pOMn/1MR4dj+6E0x/HPjIhv7qXODGAKMBoI4MfAKmBuinGY7dPKnirCrEzt3dVzCfD1\niFgdEWuArwPT2zkGM7NMS/OK/6uSZgO/AP4mIhYWqDMcWJq3vDRZtwdJM8j9D4GBAwemGKZZifIe\nsvLTg/oC/pWt7R/SuuK/HjgS6A/MA56QdFSBetXAxrzljUB1oX7+iJgXETURUdOvX7+UwjQrQ+ND\nVmo3MkDrOjoas9Skkvgj4mcRsTkitkfE/cAi4MwCVRuAnnnLPYGGiIg04jAzs71rqz7+AAqN1llG\n7sZuo9HJOjMzaycVJ35JvSWdLqlKUldJ04CTgB8WqP5t4K8k9Zd0OHANcF+lMZiZWenSuLnbDbgV\nGAbsAlYAUyJipaQTgaciojqp+6/k7gU0Pqrom8k6MzNrJxUn/oioB8YVKXuB3A3dxuUA/jp5me2/\n/Pxd68T8IBaztuDn71on5rl6zMwyxlf8Zu3JPwqzTsCJ36w9Nf4oDBjgLiDrIE78ZiVYHX0LJ+pe\nJUwn0vxGr1kHc+I3K8GE7XOom93KbhmP6LFOxjd3zcwyxonfzCxjnPjNzDLGid/MLGN8c9csz08P\nuhJqL8wteASO7aec+M3yDNC6pnH2Zvsrd/WYmWWME7+ZWcY48ZuZZYwTv5lZxjjxm5lljBO/mVnG\npPGw9YMk3SPpHUmbJb0m6QtF6k6XtEtSQ97r5EpjMDOz0qUxjr8r8B4wEXgXOBN4SNLIiKgrUP+l\niJiQwn7NzKwV0njY+hagNm/VDyStAsYCdZW2b2Zm6Uq9j1/SYcBQYFmRKsdIWidppaSbJBX84yNp\nhqTFkhbX19enHaaZWWalmvgldQPmA/dHxIoCVZ4HRgCfBKYCFwDXFWorIuZFRE1E1PTr1y/NMM3M\nMi21xC/pAOA7wO+AmYXqRMSvImJVROyOiDeAvwPOTSsGMzPbu1QmaZMk4B7gMODMiNhR4qYBKI0Y\nzFrtzpG5h6CTPFu3g8Mxa2tpXfH/C/AZ4KyI2FqskqQvJPcAkDQMuAl4PKUYzFpn47u5GTlrNzJh\n+5yOjsaszaUxjn8QcBkwBvhN3vj8aZIGJu8bJzY/FXhd0hbgP4DHgNsqjcHMzEqXxnDOd2i5u6Y6\nr+61wLWV7tPMzFrPUzaYmWWME7+ZWcb40YuWTXkjefxsXcsaJ37LpsaRPGYZ5K4eM7OM8RW/WTsa\nP/sZ1mzI/dSlrqqDg7HMcuI3a0drNmylbvbk3EJth4ZiGeauHjOzjPEVv1ln0HyU0dVvdGw8tl9z\n4jfrDPJHGdX26thYbL/nxG/WUXoN/H2S928JrB058Zt1FHfnWAfxzV0zs4xx4jczyxgnfjOzjHHi\nNzPLGN/ctewoMiNn/jQK/Xsf3BGRmbUrJ37LjiIzcn5sGgWzDHBXj5lZxqRyxS/pUOAe4DRgHfDl\niHigQD0Bs4E/S1Z9E5gVEZFGHGbAx7t08u0rP5LK+2FXXRVNk7mtjr5M2D6nqdpLVVfxh9T/fhv/\nLsBKlFZXzz8BvwMOA8YAT0paGhHLmtWbAUwBRgMB/BhYBcxNKQ6zff8hK0US+IDaXh/vkqq90NM8\nWKtU3NUjqTswFbgpIhoi4qfAvwN/WqD6JcDXI2J1RKwBvg5MrzQGMzMrnSrtZZF0DLAoIg7JW3ct\nMDEizmpWdyNwWkT8LFmuAZ6NiB4F2p1B7n8IAEcDv2hliH3JdT91No6rPI6rPI6rPPtrXIMiol/z\nlWl09VQDm5qt2wjskcyTuhub1auWpOb9/BExD5hXaXCSFkdETaXtpM1xlcdxlcdxlSdrcaUxqqcB\n6NlsXU9gcwl1ewINvrlrZtZ+0kj8K4Gukj6dt2400PzGLsm60SXUMzOzNlJx4o+ILcBjwN9J6i5p\nPHAO8J0C1b8N/JWk/pIOB64B7qs0hr2ouLuojTiu8jiu8jiu8mQqropv7kLTOP57gT8G1pMbm/+A\npBOBpyKiOqkn4Gt8fBz/9e7qMTNrP6kkfjMz23d4ygYzs4xx4jczy5h9PvFLmilpsaTtku4rof7V\nkn4jaZOkeyUdlFc2WNKzkj6StELS5yuI61BJ35O0RdI7ki5soe5TkhryXr+T9EZeeZ2krXnlT7dT\nXLWSdjSL7ci88jGSliTna4mkMe0U13WS3pS0WdIqSdc1K6/ofJUai3K+Jml98vpach+rsTy181Nm\nXG16fiqIq90+T2XG1Z7fv5LzldoyV0XEPv0CvkRu/p9/Ae7bS93TgfeB4cAngIXA7Lzyl4B/BA4m\nNw3FBqBfK+NaADxI7kdrE8j9WG14idsuBL6St1wHfD6l81VyXOSmB/tukbIDgXeAq4GDgCuT5QPb\nIa6/Bo4l9wPEo5P9np/W+So1FuAycr8oHwD0B5YDl7fF+SkzrjY9PxXE1W6fp3I/U822a8vvX0n5\nijbOVan8w3eGF3BrSycyqfMAcFve8qnAb5L3Q4HtQI+88hcav8hlxtKd3KR1Q/PWfSf/H66FbQcD\nu4DBaX/wyo1rL1/U04A1JAMEknXvAme05/lK6s4B7k7jfJUTC/AiMCNv+X8BL6d9flL4TKV2fio8\nX+3yearkfLXl96/ZflrMV7Rxrtrnu3rKNBxYmre8FDhMUp+k7FcRsblZ+fBW7GcosDMiVrairYuB\nFyKirtn6+ZLqJT0taXSB7doqrrMk/VbSMklX5K0fDrweyacu8fpe2kozLqBpiPCJ7PlDwNaer3Ji\nKfR5Gp5Xltb5KTeuJm1wfiqNqz0+T62Jq1Fbfv/K0aa5KmuJv9BcQZCbV6h5WWN5oTmHStlPqfMX\nNXcxe/6obRq5K5FBwLPAjyT1boe4HgI+A/QDLgW+IumCvLY6w/mqJfc5/lbeukrOVypzTxUoa6md\ntOPKV0u656eSuNrr81RuXPna8vtXjjbNVZ068UtaKCmKvH7aiiYLzRUEuXmFSp5zqIS4ypm/KL/d\nCcAfAI/kr4+IRRGxNSI+ioivkuvPO7Gt44qI5RGxNiJ2RcSLwP8Bzk2KO8P5mknuizo5IrbnxV3S\n+SoirbmnWnVMKcUFtNn5aXVcaX2e0o6rUaXfv5SlkquK6dSJPyJOjggVeU1oRZOF5gp6PyLWJ2VH\nSurRrHyPuYRKiKuc+YvyXQI8FhENe6kXgPZY2XZxFdrvMmBUcnXbaFShttoiLkn/E5gFnBoRq8uI\ne2/Smnuq5PPTBnG15fmpKK4W9tuh5ytR0fcvZankqqLSvGHRES9yIxeqgK+Su3lTBXQtUvcM4DfA\nZ4HewDN8/E75y8AdSRtfpLJRPf9GblRBd2A8exlRQO7u/EbglGbrBybbH5jEdR1QD/Rp67jIzbn0\nCXIf8uPI3Xy7JClrHIVxFblRGDOpbFRPOXFNS/4dP1OgrOLzVWoswOXAW+RG9BxO7ovXfFRPKuen\nzLja9PxUEFe7fZ5a8Zlqr5+EQi4AAADkSURBVO9fSfmKNs5VrTqhnelFrg8zmr1q8/7RGoCBefX/\nitwwqU3k+j0PyisbTG7Y1FZyw/QqGRJ4KPB9YAu50QkX5pWdSK5LIL/+BckHXc3WDyd3k2sLuXmQ\n/h9Q0x5xJV+a9ck5XAFc2aytY4Alyfl6FTimneJaBexI4mp8zU3rfBWLpUAcAv4B+G3y+gc+Piol\ntfNTZlxten4qiKvdPk/lxNXO379aCuQr2jlXea4eM7OM6dR9/GZmlj4nfjOzjHHiNzPLGCd+M7OM\nceI3M8sYJ34zs4xx4jczyxgnfjOzjPkvwBUh3xfI6EwAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "[0.0543751642 -0.0555369332]\n",
            "Epoch: 0 | disc_loss: -0.06103454530239105 | gen_loss: -0.12238053977489471\n",
            "Epoch: 100 | disc_loss: -0.10593518614768982 | gen_loss: -0.13589432835578918\n",
            "Epoch: 200 | disc_loss: -0.09893875569105148 | gen_loss: -0.16913078725337982\n",
            "Epoch: 300 | disc_loss: -0.15194180607795715 | gen_loss: -0.18081513047218323\n",
            "Epoch: 400 | disc_loss: -0.18861912190914154 | gen_loss: -0.14300504326820374\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nI0Zw6623Nu2nsLCQm266idGjR/PWW2+17cU3/gXJ923cuHEu0un9sE/m+7KflStX7vd48K0v5LX9\nKO29/fbbPnr0aN+5c6dv27bNTzjhBL/77rt96tSpvmbNGnd3X7p0qU+ZMsXd3a+44gq/8MILfc+e\nPb5ixQo//vjj3d39t7/9rV911VW+d+9e37Nnj8+YMcMXL17sa9eudTPzt956q2mfW7ZscXf3hoYG\nnzx5sr///vupegcP9pqaGnd3r66u9mOPPda/+OIL3717t0+ZMsV/85vfuLs74E888UTW15R+XIPn\nLPMMmapuEBFJhCVLlnD++edTUFBAQUEBM2fOpL6+njfffJOLLrqoabtdu3Y13Z81axbdunXj5JNP\nZtOmTQC8/PLLvPzyy4wdOxaAuro6Pv74Y4qLixk8eDATJkxoev6TTz5JZWUlDQ0NfPbZZ6xcuZJR\no0btV9c777zDmWeeyYABqYnyZs+ezWuvvcasWbPo3r07F1xwQV5ef4thbWZ1aYt6Ag+4+/fyUoGI\nSCvt3buXvn378t5772Vcf9hhhzXd9+B6s+7OD37wA66++ur9tq2qqqJXr15Nj9euXcv8+fN55513\nOOKII7jyyitz/gVnQUFBm/qpw1rss3b3wsYb8DVgJ/CrvOxdRCSiiRMn8vzzz1NfX09dXR0vvPAC\nhx9+OEOGDOFXv0pFkrvz/vvvH7CdadOm8fDDD1NXlzoPra6u5osvvmi23bZt2+jVqxdFRUVs2rSJ\nl156qWld79692b59OwDjx49n8eLFbN68mT179rBw4UImT56cr5fdJNdukAuAL4DX816JiCTGwL49\n8zqCY2Dfni1uU1ZWxnnnnceoUaM4+uijGTlyJEVFRSxYsIBrr72WO++8k927d3PxxRczevTorO2c\nc845rFq1ilNPPRVIfQn42GOPNTsDHj16NGPHjmXYsGEce+yxTJw4sWldeXk506dP55hjjuHVV19l\n3rx5TJkyBXdnxowZnH/++a08EtlZ438NIm1s9grwmrtXZFlfDpQDFBcXj1u3LuMc2iKdR0VRaiRI\n+n3Zz6pVqzjppJM6ugzq6uooLCxkx44dnHHGGVRWVnLKKad0dFmtlum4mtlydy9N3zbymbWZDQYm\nA3+TbRt3rwQqAUpLS6P/FRARiaC8vJyVK1dSX1/PFVdckeigzlUu3SDfAd5w97VxFSMiciCPP/54\n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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "[-2.14925909 0.169976756]\n",
            "Epoch: 500 | disc_loss: -0.15267013013362885 | gen_loss: -0.14197994768619537\n",
            "Epoch: 600 | disc_loss: -0.1421888768672943 | gen_loss: -0.10350304841995239\n",
            "Epoch: 700 | disc_loss: -0.10376076400279999 | gen_loss: -0.10159469395875931\n",
            "Epoch: 800 | disc_loss: -0.09147822111845016 | gen_loss: -0.10562855005264282\n",
            "Epoch: 900 | disc_loss: -0.09600583463907242 | gen_loss: -0.13315896689891815\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n7k6XLtk7H+6++26uuOKKvMJ6z549dO3atdk1aSInkXamIQRXz55S0CPXjuC2227j+OOP5/TTT+fS\nSy9lzpw5fPjhh0yePJkxY8ZwxhlnsGLFCgCuuuoqbrjhBk477TSOPfZYnnzyycZ27rzzTsaOHcuI\nESP4/ve/D8Dq1as5/vjjufLKKxk2bBgfffQRM2bMoKKigqFDhzaud88997BhwwYmTJjAhAkTAJg3\nbx7Dhw9n2LBh3HzzzY3bKS4u5tvf/jYjR47kjTfeaNmbb/gXpNC3MWPGuIjkb+DNz2a939aWLVu2\n3+NC19ZUe2+++aaPHDnSd+7c6du2bfMvfvGLfuedd/rEiRN95cqV7u6+cOFCnzBhgru7T58+3S+6\n6CLfs2ePL1261I877jh3d//973/vV199te/du9f37NnjU6ZM8ZdfftlXrVrlZuZvvPFG4zY3b97s\n7u719fU+fvx4f+edd4JaBw70mpoad3dfv369H3PMMb5x40bfvXu3T5gwwX/961+7uzvgjz32WM73\nlLlPw9cs8iyZqm4QEUmFBQsWcMEFF1BUVERRURFTp06lrq6O119/nYsvvrhxvV27djXenzZtGl26\ndOHEE0/k008/BeCFF17ghRdeYPTo0QDU1tbywQcfUFZWxsCBAznllFMaX//4449TXV1NfX09H3/8\nMcuWLWPEiBH71fXWW29x1llnUVoaTJR3+eWX88orrzBt2jS6du3KhRdeWJD3r7AWkdTau3cvvXv3\nZsmSJVmXd+/evfG+h9ebdXe+973vcc011+y37urVq+nZs2fj41WrVjFnzhzeeustjjjiCK666qq8\nf71ZVFTUon7qKPVZi0gqjBs3jmeeeYa6ujpqa2t59tlnOeywwxg0aBBPPPEEEATxO++8c9B2Jk2a\nxIMPPkhtbS0A69evZ+PGjQest23bNnr27ElJSQmffvopzz//fOOyXr16sX37dgBOPvlkXn75ZTZt\n2sSePXuYN28e48ePL9TbbqQjaxFplv69exR0BEf/3j0Ounzs2LGcf/75jBgxgqOOOorhw4dTUlLC\n3LlzmTFjBrfffju7d+/mkksuYeTIkTnbOffcc1m+fDmnnnoqEJwEfOSRRw44Ah45ciSjR49myJAh\nHHPMMYwbN65xWWVlJZMnT+boo4/mpZdeYvbs2UyYMAF3Z8qUKVxwwQUt2BPZWcOfBoVWUVHhuviA\n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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "[0.853145778 0.838530183]\n",
            "Epoch: 1000 | disc_loss: -0.1114516481757164 | gen_loss: -0.15837223827838898\n",
            "Epoch: 1100 | disc_loss: -0.06767373532056808 | gen_loss: -0.1504044383764267\n",
            "Epoch: 1200 | disc_loss: -0.06864867359399796 | gen_loss: -0.1676173359155655\n",
            "Epoch: 1300 | disc_loss: -0.05591694265604019 | gen_loss: -0.18266859650611877\n",
            "Epoch: 1400 | disc_loss: -0.03987466171383858 | gen_loss: -0.16560424864292145\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nMmUKI0eOZPz48axYsQKAK6+8kuuvv54zzjiDE088kccff7yxnbvuuotRo0YxdOhQvve97wFQW1vL\nySefzOWXX87gwYP5+OOPufbaa6msrGTQoEGN291zzz2sW7eOiRMnMnHiRADmz5/PkCFDGDx4MLfc\nckvjfkpLS7nxxhsZNmwYr732WstefMO/IPluwNFkLvR5RWzZBcDvD/a8kSNHukhQvtc9933xZcuW\n7fe43y3PFLX9JO298cYbPmzYMN+xY4dv3brVv/zlL/tdd93lkyZN8pUrV7q7++uvv+4TJ050d/cr\nrrjCL7zwQt+zZ48vXbrUTzrpJHd3//Wvf+1XXXWV79271/fs2eNTp071hQsX+kcffeRm5q+99lrj\nPjdt2uTu7vX19T5hwgR/5513MvX26+cbNmxwd/e1a9f6CSec4J999pnv3r3bJ06c6L/85S/d3R3w\nRx99NO9ryj6u0XMWe45MbbIbxN0/N7M17H9lZl0LTERa1aJFizj//PMpKSmhpKSEadOmsXPnTl59\n9VUuuuiixu127drVeH/69Ol06tSJU089lfXr1wPw/PPP8/zzzzNixAgA6urq+OCDDygvL6dfv36M\nGTOm8fmPPfYYNTU11NfX88knn7Bs2TKGDh26X11vvvkmZ511Fg29CTNmzOCll15i+vTpdO7cmQsu\nuKAorz/pD4z/BvxPM/sPYDcwE3imKBWIiDTT3r176dGjB2+//XbO9UcccUTjfY+uN+vufPe73+Xq\nq6/eb9va2lq6du3a+Pijjz5izpw5vPnmmxx99NFceeWVBc/gLCkpaVE/dVzScda3A28CK4HlwO+B\nfyhKBSIiCYwdO5ann36anTt3UldXxzPPPMNRRx1F//79+fnPfw5kgvidd945aDuTJ0/mgQceoK6u\nDoC1a9fy2WefHbDd1q1b6dq1K2VlZaxfv57nnnuucV23bt3Ytm0bAKNHj2bhwoVs3LiRPXv2MH/+\nfCZMmFCsl90o0Tdrd98NfCu6icghrk+PI4s6gqNPjyOb3GbUqFGcd955DB06lOOOO44hQ4ZQVlbG\nvHnzuPbaa7njjjvYvXs3F198McOGDcvbzrnnnsvy5cs5/fTTgcyPgA8//PAB34CHDRvGiBEjGDhw\nICeccAJjx45tXFdVVcWUKVM4/vjjefHFF5k9ezYTJ07E3Zk6dSrnn39+M49EftbwX4Niq6ysdF18\n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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "[-3.71920252 -0.87840414]\n",
            "Epoch: 1500 | disc_loss: -0.009682189673185349 | gen_loss: -0.11512630432844162\n",
            "Epoch: 1600 | disc_loss: -0.0400984100997448 | gen_loss: -0.03537088260054588\n",
            "Epoch: 1700 | disc_loss: -0.03337773680686951 | gen_loss: 0.021227868273854256\n",
            "Epoch: 1800 | disc_loss: -0.03858282417058945 | gen_loss: 0.050536081194877625\n",
            "Epoch: 1900 | disc_loss: -0.04694649204611778 | gen_loss: 0.03264496847987175\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nHzFr1izGjx/P1KlTWb9+PQBXX301N910E2eddRYnnXQSTz31VH0799xzDxMmTGD06NF8//vfB6Cs\nrIxTTz2Vq666ipEjR/Lxxx9z/fXXU1hYyIgRI+q3W7x4MVu2bGH69OlMnz4dgKVLlzJq1ChGjhzJ\nbbfdVr+f3NxcbrnlFsaMGcMbb7zRuhdf9z9I3Lfx48e7SJIMue25lPfFfe3atYc8jvv4pNPem2++\n6WPGjPG9e/f6rl27/JRTTvF77rnHZ8yY4Rs2bHB395UrV/r06dPd3X3+/Pl+ySWX+IEDB3zNmjV+\n8sknu7v77373O7/mmmv84MGDfuDAAZ89e7YvX77cN27c6Gbmb7zxRv0+d+zY4e7utbW1Pm3aNH/3\n3XeDeocM8crKSnd3r6io8BNPPNE//fRT379/v0+fPt1//etfu7s74E888USTr6nhcQ2fs8pTZKq6\nQUQkEVasWMFFF11ETk4OOTk5zJkzh5qaGl5//XUuvfTS+u327dtXf3/u3Ll069aN008/nW3btgHw\n4osv8uKLLzJu3DgAqqur+fDDD8nPz2fIkCFMmjSp/vlPPvkkpaWl1NbWsnXrVtauXcvo0aMPqeut\nt97inHPOoe5b2/PmzeOVV15h7ty5dO/enYsvvjiW16+wFpHEOnjwIP369eOdd95Jub5nz5719z2c\n0sjd+d73vse11x46yK2srIzevXvXP964cSOLFi3irbfe4uijj+bqq6/O+BucOTk5reqnjlKftYgk\nwuTJk3n22Wepqamhurqa5557jqOOOoqhQ4fyy18G39dzd959993DtjNz5kwefvhhqquDqforKir4\n9NNPG223a9cuevfuTV5eHtu2beOFF16oX9enTx927w6+djJx4kSWL1/O9u3bOXDgAEuXLmXatGlx\nvex6OrMWkYwN6tcr1hEcg/r1anabCRMmcOGFFzJ69GiOO+44Ro0aRV5eHkuWLOH666/nrrvuYv/+\n/Vx22WWMGTOmyXbOP/981q1bx5lnngkEFwEfe+yxRmfAY8aMYdy4cQwfPpwTTzyRyZMn168rKipi\n1qxZnHDCCbz88suUlJQwffp03J3Zs2dz0UUXtfBINM3qfjWIW2FhoeuPD0iSFCx8vn44WvS+wLp1\n6zjttNPauwyqq6vJzc1lz549nH322ZSWlnLGGWe0d1ktluq4mtlqdy9suK3OrEUkMYqKili7di01\n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\nRK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "[0.310019612 0.0304482672]\n",
            "Epoch: 2000 | disc_loss: -0.00454828143119812 | gen_loss: -0.009268422611057758\n",
            "Epoch: 2100 | disc_loss: 0.012509855441749096 | gen_loss: -0.05398347228765488\n",
            "Epoch: 2200 | disc_loss: -0.007384761702269316 | gen_loss: -0.07089145481586456\n",
            "Epoch: 2300 | disc_loss: -0.028169212862849236 | gen_loss: -0.08361301571130753\n",
            "Epoch: 2400 | disc_loss: -0.04730561003088951 | gen_loss: -0.10167533159255981\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nzJd4aBg7AAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "[0.118789308 0.235811546]\n",
            "Epoch: 2500 | disc_loss: -0.055544041097164154 | gen_loss: -0.11515508592128754\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py:1781: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "If using Keras pass *_constraint arguments to layers.\n",
            "INFO:tensorflow:Assets written to: /tmp/saved_model/assets\n",
            "CPU times: user 2min 4s, sys: 3.08 s, total: 2min 8s\n",
            "Wall time: 1min 46s\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-05-14T06:46:24.425722Z",
          "start_time": "2019-05-14T06:46:24.188266Z"
        },
        "colab_type": "code",
        "id": "XZbwB70ESYcH",
        "outputId": "72319444-3c2f-47ef-d6ce-8b647b1eefbc",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 286
        }
      },
      "source": [
        "plt.plot(losses.gen_loss.values)\n"
      ],
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7feaaa32e668>]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 17
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2019-05-14T06:46:38.649136Z",
          "start_time": "2019-05-14T06:46:38.440378Z"
        },
        "colab_type": "code",
        "id": "FydTnKDxSYcL",
        "outputId": "846bad5b-04d3-4220-a806-a3d50d54c667",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 286
        }
      },
      "source": [
        "plt.plot(losses.disc_loss.values)\n"
      ],
      "execution_count": 18,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7feaa98b8b70>]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 18
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nEbEAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "lcIzLZj5Seh9",
        "colab_type": "text"
      },
      "source": [
        "#### Encoder GAN Model"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "JPQP0vvCja5o",
        "colab": {}
      },
      "source": [
        "w_generator.trainable =False"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3m0fQ6OXgPf1",
        "colab_type": "text"
      },
      "source": [
        "# GAN Training"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "_4FU2Q7yh0OU",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def test_encoding(M=M, n=n):\n",
        "    inp = np.arange(0,M)\n",
        "    coding = gan_encoder.predict(inp)\n",
        "    fig = plt.figure(figsize=(4,4))\n",
        "    plt.plot(coding[:,0], coding[:, 1], \"b.\")\n",
        "    plt.xlabel(\"$x_1$\", fontsize=18)\n",
        "    plt.ylabel(\"$x_2$\", fontsize=18, rotation=0)\n",
        "    plt.grid(True)\n",
        "    plt.gca().set_ylim(-2, 2)\n",
        "    plt.gca().set_xlim(-2, 2)\n",
        "    plt.show()\n",
        "\n",
        "\n",
        "\n",
        "def w_gan_Test_AE(data):\n",
        "    '''Calculate Bit Error for varying SNRs'''\n",
        "    snr_range = np.linspace(0, 15, 31)\n",
        "    bber_vec = [None] * len(snr_range)\n",
        "        \n",
        "    for db in range(len(snr_range)):           \n",
        "        noise_std = EbNo_to_noise(snr_range[db])\n",
        "        code_word = w_gan_encoder(data)\n",
        "        rcvd_word = code_word + tf.random.normal(tf.shape(code_word), mean=0.0, stddev=noise_std)\n",
        "        dcoded_msg = w_gan_decoder(rcvd_word)\n",
        "        bber_vec[db] = B_Ber_m(data, dcoded_msg)\n",
        "        if (db % 6 == 0) & (db > 0):\n",
        "            print(f'Progress: {db} of {30} parts')\n",
        "\n",
        "    return (snr_range, bber_vec)\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6GW2opX7SwMo",
        "colab_type": "text"
      },
      "source": [
        "\n",
        "# AE training"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "sNHtzAC4SPBq",
        "colab_type": "code",
        "outputId": "6ed750ed-0b76-4e01-996d-d0a107fbc85d",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 374
        }
      },
      "source": [
        "def get_gan_encoder(M):\n",
        "  model = keras.models.Sequential([\n",
        "            keras.layers.Embedding(M, M, embeddings_initializer='glorot_normal'),\n",
        "            keras.layers.Dense(M, activation=\"elu\"),\n",
        "            keras.layers.Dense(n, activation=None),\n",
        "            e2,\n",
        "            EncOut,\n",
        "            GenIn])\n",
        "  return model\n",
        "\n",
        "gan_encoder = get_gan_encoder(M)\n",
        "gan_encoder.summary()"
      ],
      "execution_count": 21,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential_1\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "embedding (Embedding)        (None, None, 16)          256       \n",
            "_________________________________________________________________\n",
            "dense_10 (Dense)             (None, None, 16)          272       \n",
            "_________________________________________________________________\n",
            "dense_11 (Dense)             (None, None, 2)           34        \n",
            "_________________________________________________________________\n",
            "lambda (Lambda)              (None, 1, 2)              0         \n",
            "_________________________________________________________________\n",
            "lambda_1 (Lambda)            (None, 1, 2)              0         \n",
            "_________________________________________________________________\n",
            "lambda_2 (Lambda)            (None, None)              0         \n",
            "=================================================================\n",
            "Total params: 562\n",
            "Trainable params: 562\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "C5KjEhDvSWQR",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def get_gan_decoder(M):\n",
        "   model= keras.models.Sequential([\n",
        "                #DecIn,\n",
        "                #d1,\n",
        "                keras.layers.Dense(M, activation=\"elu\"),\n",
        "                keras.layers.Dense(M, activation='softmax')\n",
        "                ])\n",
        "   return model\n",
        "\n",
        "\n",
        "\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "PB4rw6Qhtdbe",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "w_generator.trainable =False"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "FiuN3SZYpeTU",
        "colab_type": "code",
        "outputId": "01b011c1-cbeb-44ab-a0a6-0886788e6f03",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 537
        }
      },
      "source": [
        "%%time\n",
        "w_gan_decoder = get_gan_decoder(M)\n",
        "w_gan_encoder = get_gan_encoder(M)\n",
        "\n",
        "gan_AE = tf.keras.models.Sequential([w_gan_encoder,w_generator,w_gan_decoder])\n",
        "data, test_data = random_sample(10000000), random_sample(10000)\n",
        "start = time.time()\n",
        "gan_AE.compile(optimizer=tf.keras.optimizers.Nadam(lr=0.005),loss='sparse_categorical_crossentropy',metrics=['accuracy'])\n",
        "history = gan_AE.fit(data, data, batch_size=500,steps_per_epoch=400, epochs=10)\n",
        "#time_to_train_gan += time.time()-start\n",
        "time_to_train_w_gan += time.time()-start\n",
        "tf.print ('Time for the training is {} sec,'.format(time_to_train_w_gan))\n",
        "gan_AE.summary()  "
      ],
      "execution_count": 24,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Train on 10000000 samples\n",
            "Epoch 1/10\n",
            "  200000/10000000 [..............................] - ETA: 2:43 - loss: 0.7429 - accuracy: 0.8590Epoch 2/10\n",
            "  199000/10000000 [..............................] - ETA: 1:08 - loss: 0.0456 - accuracy: 0.9997Epoch 3/10\n",
            "  199500/10000000 [..............................] - ETA: 1:11 - loss: 0.0138 - accuracy: 0.9998Epoch 4/10\n",
            "  199500/10000000 [..............................] - ETA: 1:08 - loss: 0.0070 - accuracy: 0.9999Epoch 5/10\n",
            "  200000/10000000 [..............................] - ETA: 1:09 - loss: 0.0042 - accuracy: 0.9999Epoch 6/10\n",
            "  197500/10000000 [..............................] - ETA: 1:09 - loss: 0.0029 - accuracy: 0.9999Epoch 7/10\n",
            "  195500/10000000 [..............................] - ETA: 1:10 - loss: 0.0020 - accuracy: 0.9999Epoch 8/10\n",
            "  196500/10000000 [..............................] - ETA: 1:10 - loss: 0.0017 - accuracy: 0.9999Epoch 9/10\n",
            "  196000/10000000 [..............................] - ETA: 1:10 - loss: 0.0012 - accuracy: 0.9999Epoch 10/10\n",
            "  199000/10000000 [..............................] - ETA: 1:11 - loss: 9.4316e-04 - accuracy: 1.0000Time for the training is 122.20940804481506 sec,\n",
            "Model: \"sequential_4\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "sequential_3 (Sequential)    (None, None)              562       \n",
            "_________________________________________________________________\n",
            "model (Model)                (None, 2)                 1294      \n",
            "_________________________________________________________________\n",
            "sequential_2 (Sequential)    (None, 16)                320       \n",
            "=================================================================\n",
            "Total params: 2,176\n",
            "Trainable params: 882\n",
            "Non-trainable params: 1,294\n",
            "_________________________________________________________________\n",
            "CPU times: user 21.5 s, sys: 711 ms, total: 22.2 s\n",
            "Wall time: 16.6 s\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ngrucnfWBOHl",
        "colab_type": "text"
      },
      "source": [
        "### Training MI"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "D5B2TUanPC5d",
        "colab_type": "code",
        "outputId": "b414b86f-91a5-49e6-8a04-284d4a698ac0",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 295
        }
      },
      "source": [
        "w_gan_encoder.trainable = False\n",
        "w_gan_decoder.trainable = False\n",
        "\n",
        "test_encoding(M=M,n=n)   \n"
      ],
      "execution_count": 25,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 288x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ukO76l6yIoPc",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# test msg sequence for normal encoding\n",
        "N_test = 50000\n",
        "test_msg = np.random.randint(M, size=N_test)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "G5iCDE4dSL35",
        "colab_type": "text"
      },
      "source": [
        "#### decoder GAN Model"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "7M-S0sbhIoPw",
        "colab_type": "code",
        "outputId": "a2640997-140b-4020-ca77-a918f40225bc",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 106
        }
      },
      "source": [
        "w_gan_bber_data = w_gan_Test_AE(test_msg)"
      ],
      "execution_count": 27,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Progress: 6 of 30 parts\n",
            "Progress: 12 of 30 parts\n",
            "Progress: 18 of 30 parts\n",
            "Progress: 24 of 30 parts\n",
            "Progress: 30 of 30 parts\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "UYdEm0eQIoP2",
        "colab_type": "code",
        "outputId": "21badf32-1100-4c1d-a3f4-64383d826835",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 352
        }
      },
      "source": [
        "# Approximate 16 QAM Error\n",
        "def SIXT_QAM_sim(ebno):\n",
        "    return (3.0/2)*special.erfc(np.sqrt((4.0/10)*10.**(ebno/10)))\n",
        "\n",
        "ebnodbs = np.linspace(0,15,16)\n",
        "fig = plt.figure(figsize=(8, 5))\n",
        "plt.semilogy(w_gan_bber_data[0], w_gan_bber_data[1], '^-')\n",
        "plt.semilogy(ebnodbs, SIXT_QAM_sim(ebnodbs), '*-');\n",
        "plt.gca().set_ylim(1e-5, 1)\n",
        "plt.gca().set_xlim(0, 15)\n",
        "plt.ylabel(\"Batch Symbol Error Rate\", fontsize=14, rotation=90)\n",
        "plt.xlabel(\"SNR [dB]\", fontsize=18)\n",
        "plt.legend(['AE with WGAN', '16QAM'],\n",
        "           prop={'size': 14}, loc='upper right');\n",
        "plt.grid(True, which=\"both\")\n",
        "\n",
        "#print('time to train the AE Model with MI',time_to_train_mi)\n",
        "#print('time to train the AE Model with GAN',time_to_train_gan)"
      ],
      "execution_count": 28,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 576x360 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "SOVyvAI8Z1mu",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}